package Navi_run;

import encryption.Hash;
import it.unisa.dia.gas.jpbc.Element;

import java.math.BigInteger;
import java.util.Arrays;
import java.util.Map;

import static encryption.Opaak.verify_ZKPK;

public class Navigation_verify {
    public static boolean verifyZKPK(Map<String, BigInteger> ZKPK,BigInteger F){
        if (verify_ZKPK(ZKPK,F)){
            System.out.println("零知识证明验证成功");
            return true;
        }else {
            System.out.println("零知识证明验证失败");
            return false;
        }
    }

    //验证导航请求司机身份
    public static boolean verifyRequest(Element REi1, Element REi2, Element gpk_A, Element gpk_B, Element gpk_g, Map<String,Object> Mi, BigInteger ci, BigInteger ssi, int rci) {
        //计算Ei = e(REi1, A)^ci · e(REi2, g))^ci · e(REi1, B)^ssi
        Element Ei = (params.pairing.pairing(REi1, gpk_A).pow(ci)).mul(
                (params.pairing.pairing(REi2, gpk_g).pow(ci)).negate()
        ).mul(params.pairing.pairing(REi1, gpk_B).pow(ssi));
        // 计算cii 与司机发来的ci比较
        String Mi_str = Arrays.deepToString((double[][])Mi.get("Index_Enc")) + ((BigInteger)Mi.get("rlpi")).toString();
        String temp = REi1.toString() + REi2.toString() + Ei.toString() + Mi_str + rci;
        BigInteger cii = new BigInteger(Hash.sha256(temp));
        if (cii.compareTo(ci) == 0) {
            System.out.println("验证rdi导航查询成功");
            return true;
        } else {
            System.out.println("验证rdi导航查询失败");
            return false;
        }
    }
    //验证报告司机身份
    public static boolean verifyReport(Element REi1, Element REi2, Element gpk_A, Element gpk_B, Element gpk_g, Map<String,Object> Mi, BigInteger ci, BigInteger ssi, int rci) {
        //计算Ei = e(REi1, A)^ci · e(REi2, g))^ci · e(REi1, B)^ssi
        Element Ei = (params.pairing.pairing(REi1, gpk_A).pow(ci)).mul(
                (params.pairing.pairing(REi2, gpk_g).pow(ci)).negate()
        ).mul(params.pairing.pairing(REi1, gpk_B).pow(ssi));
        // 计算cii 与司机发来的ci比较
        String temp = REi1.toString() + REi2.toString() + Ei.toString() + rci;
        BigInteger cii = new BigInteger(Hash.sha256(temp));
        if (cii.compareTo(ci) == 0) {
            System.out.println("验证贡献司机有效身份成功");
            return true;
        } else {
            System.out.println("验证贡献司机有效身份失败");
            return false;
        }
    }
}
